<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Facturacion extends CI_Controller {

    public function __construct() {
        parent::__construct();
        session_start();
        $this->estaLogueado();
        $this->load->model('cuartoM');
        $this->load->model('reserva_x_cuartoM');
        $this->load->model('reservaM');
        $this->load->model('categoriaM');
        $this->load->model('documentoM');
        $this->load->model('estadoCivilM');
        $this->load->model('procedencia_destinoM');
        $this->load->model('tarifa_x_diaM');
        $this->load->model('impuestoM');
        $this->load->model('venta_producto_servicioM');
        $this->load->model('establecimientoM');
        $this->load->model('ajusteM');
        $this->load->model('ingreso_reservaM');
        $this->load->model('cliente_x_reservaM');
        $this->load->model('usuariosM');
    }

    public function index() {
        if ($this->validarReserva()) {
            $data = array();
            $this->loadData($data);
            //   var_dump($data);
            $this->load->view('header', $data);
            $this->load->view('menuCalendarioV/headMenuCalendario');
            $this->load->view('menuCalendarioV/facturacionV');
            $this->load->view('menuCalendarioV/footerMenuCalendario');
            $this->load->view('footer');
        } else {
            $_SESSION["mensaje"]["contenido"] = " La reserva no existe.";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:calendario");
        }
    }

    public function actulizarQuienPaga() {
        // var_dump($_POST);
        $this->escapar($_POST);
        if (!empty($_POST["idReserva"]) && $this->validarReservaPost($_POST["idReserva"])) {
            $this->load->model('clienteM');
            $this->load->model('cliente_x_reservaM');
            $idCliente = -1;
            if ($_POST["quien"] == "persona") {
                $this->formatoFechaBD($_POST['fechaNacimiento']);
                if ($_POST['idEstadoCivil'] == '') {
                    $_POST['idEstadoCivil'] = 3;
                }
                if ($_POST['idCliente'] == '') {//persona nueva
                    $this->clienteM->crearClientePersona($_POST['documento'], $_POST['nacionalidad'], $_POST['tipoDocumento'], $_POST['nombre'], $_POST['apellido'], $_POST['genero'], $_POST['fechaNacimiento'], $_POST['telefono'], $_POST['email'], $_POST['ocupacion'], $_POST['idEstadoCivil']);
                    $idCliente = mysql_insert_id();
                    if (isset($_POST["esHuesped"])) {
                        $this->verificarCantidadHuespedes($_POST["idReserva"]);
                        $this->cliente_x_reservaM->registrarClinteEnReserva($_POST['idReserva'], $idCliente);
                        $this->procedencia_destinoM->insertarRegistro($_POST['idReserva'], $idCliente, $_POST['paisProcedencia'], $_POST['paisDestino'], $_POST['ciudadProcedencia'], $_POST['ciudadDestino']);
                    }
                } else {//persona vieja
                    $idCliente = $_POST['idCliente'];
                    $this->clienteM->actualizarClientePersona($_POST['idCliente'], $_POST['documento'], $_POST['nacionalidad'], $_POST['tipoDocumento'], $_POST['nombre'], $_POST['apellido'], $_POST['genero'], $_POST['fechaNacimiento'], $_POST['telefono'], $_POST['email'], $_POST['ocupacion'], $_POST['idEstadoCivil']);
                    $existe = $this->cliente_x_reservaM->existeClienteEnReserva($_POST['idReserva'], $idCliente);
                    if (isset($_POST["esHuesped"])) {
                        if ($existe[0]->cantidad == 0) {
                            $this->verificarCantidadHuespedes($_POST["idReserva"]);
                            $this->cliente_x_reservaM->registrarClinteEnReserva($_POST['idReserva'], $idCliente);
                            $this->procedencia_destinoM->insertarRegistro($_POST['idReserva'], $idCliente, $_POST['paisProcedencia'], $_POST['paisDestino'], $_POST['ciudadProcedencia'], $_POST['ciudadDestino']);
                        } else {
                            $this->procedencia_destinoM->actualizarRegistro($_POST['idReserva'], $idCliente, $_POST['paisProcedencia'], $_POST['paisDestino'], $_POST['ciudadProcedencia'], $_POST['ciudadDestino']);
                        }
                    } else {
                        $this->cliente_x_reservaM->eliminarClienteDeReserva($_POST['idReserva'], $idCliente);
                        $this->procedencia_destinoM->eliminarRegistro($_POST['idReserva'], $idCliente);
                    }
                }
            } else if ($_POST["quien"] == "empresa") {
                $idTitularAnterior = $this->reservaM->obtenerDatos("id_cliente", $_POST["idReserva"]);
                $idTitularAnterior = $idTitularAnterior[0]->id_cliente;
                $this->cliente_x_reservaM->eliminarClienteDeReserva($_POST['idReserva'], $idTitularAnterior);
                $this->procedencia_destinoM->eliminarRegistro($_POST['idReserva'], $idTitularAnterior);

                if ($_POST['idCliente'] == '') {//empresa nueva
                    $this->clienteM->crearClienteEmpresa($_POST['identificacionEmpresa'], $_POST['paisEmpresa'], $_POST['nombreEmpresa'], $_POST['telefonoEmpresa'], $_POST['direccionEmpresa'], $_POST['emailEmpresa']);
                    $idCliente = mysql_insert_id();
                } else {//empresa vieja
                    $idCliente = $_POST['idCliente'];
                    $this->clienteM->actualizarClienteEmpresa($_POST['idCliente'], $_POST['identificacionEmpresa'], $_POST['paisEmpresa'], $_POST['nombreEmpresa'], $_POST['telefonoEmpresa'], $_POST['direccionEmpresa'], $_POST['emailEmpresa']);
                }
            }
            if ($idCliente != -1) {
                $this->reservaM->atualizarQuienPaga($idCliente, $_POST["idReserva"]);
            }
            $_SESSION["mensaje"]["contenido"] = "Los cambios se guardaron exitosamente";
            $_SESSION["mensaje"]["tipo"] = "exito";
            header("location:../facturacion?reserva=" . $_POST["idReserva"]);
        } else {
            $_SESSION["mensaje"]["contenido"] = " La reserva no existe.";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
        }
    }

    private function verificarCantidadHuespedes($idReserva) {
        $clientesDecalarados = $this->reservaM->obtenerDatos("numero_personas", $idReserva);
        $clientesDecalarados = $clientesDecalarados[0]->numero_personas;

        $clientesRegistrados = $this->cliente_x_reservaM->contarHuespedes($idReserva);
        $clientesRegistrados = $clientesRegistrados[0]->cantidad;
        if ($clientesRegistrados >= $clientesDecalarados) {
            $_SESSION["mensaje"]["contenido"] = "Solo se han declarado $clientesDecalarados húespedes en esta reserva";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("location:../facturacion?reserva=$idReserva");
            exit();
        }
    }

    private function loadData(&$data) {
        $this->escapar($_GET);
        $idReserva = $_GET["reserva"];
        $data["tab"] = "facturacion";
        $data["moneda"] = $_SESSION["establecimiento"]["moneda"];
        $data["reserva"] = $this->reservaM->consultarReservasPorID($idReserva);
        $data["cantidad_noches"] = $this->diferenciaFechas($data["reserva"][0]->fecha_ingreso, $data["reserva"][0]->fecha_salida);
        $this->formatoFechaVista($data["reserva"][0]->fecha_ingreso);
        $this->formatoFechaVista($data["reserva"][0]->fecha_salida);
        $data["capacidad"] = $this->categoriaM->obtenerCapacidad($idReserva);
        $data["tarifa_x_dia"] = $this->tarifa_x_diaM->obtenerTarifasPorReserva($idReserva);
        foreach ($data["tarifa_x_dia"] as $row) {
            $row->dia = new DateTime($row->dia);
            $row->dia = $row->dia->format('d/m/Y');
        }
        if ($data["reserva"][0]->id_tipo_cliente == 1)
            $this->formatoFechaVista($data["reserva"][0]->fecha_nacimiento);
        $data["documentos"] = $this->documentoM->obtenerDocumentos();
        $data["estadoCivil"] = $this->estadoCivilM->obtenerEstadoCivil();
        $data["esHuesped"] = $this->procedencia_destinoM->obtenerRegistro($_GET["reserva"], $data["reserva"][0]->id_cliente);
        if ($data["reserva"][0]->id_documento == "") {
            $data["reserva"][0]->id_documento = "0";
        }
        $idCuarto = $this->reserva_x_cuartoM->obtenerDatos("id_cuarto", $idReserva);
        $data["cuarto"] = $this->cuartoM->obtenerDatos("nombre, tipo", $idCuarto[0]->id_cuarto);
        $data["impuestos"] = $this->impuestoM->obtenerImpuestos($_SESSION["establecimiento"]["id_establecimiento"]);
        $consumos = $this->venta_producto_servicioM->obtenerVentas($idReserva);
        $data["consumoTotal"] = 0;
        $data["impuestosConsumo"] = 0;
        foreach ($consumos as $row) {
            $data["consumoTotal"] = $data["consumoTotal"] + $row->total_venta;
            $data["impuestosConsumo"] = $data["impuestosConsumo"] + $row->impuesto;
        }
        $data["seguroHotelero"] = $this->establecimientoM->obtenerDatos("tiene_seguro_hotelero, seguro_hotelero", $_SESSION["establecimiento"]["id_establecimiento"]);
        $data["ajustes"] = $this->ajusteM->obtenerAjustes($idReserva);
        $data["ingresos"] = $this->ingreso_reservaM->obtenerIngresos($idReserva);
        $data["ajusteAlojamiento"] = $this->ajusteM->totalAjusteAlojamiento($idReserva);
        $data["totalAlojamiento"] = $this->reservaM->obtenerDatos("total_alojamiento", $idReserva);
        $data["ajusteTotal"] = $this->ajusteM->listarAjustesByTipo($idReserva, "total");
        foreach ($data["ajusteTotal"] as $row) {
            $nombreCompleto = $this->usuariosM->obtenerDatos("nombre_completo", $row->usuario_encargado);
            $row->usuario_creacion = $nombreCompleto[0]->nombre_completo;
        }

        $data["ajusteAlojamiento"] = $this->ajusteM->listarAjustesByTipo($idReserva, "alojamiento");
        foreach ($data["ajusteAlojamiento"] as $row) {
            $nombreCompleto = $this->usuariosM->obtenerDatos("nombre_completo", $row->usuario_encargado);
            $row->usuario_creacion = $nombreCompleto[0]->nombre_completo;
        }

        $data["pagosRealizados"] = $this->ingreso_reservaM->listarIngresos($idReserva);
        foreach ($data["pagosRealizados"] as $row) {
            $nombreCompleto = $this->usuariosM->obtenerDatos("nombre_completo", $row->usuario_encargado);
            $row->usuario_creacion = $nombreCompleto[0]->nombre_completo;
        }
    }

    public function actualizarImpuestoAlojamiento() {
        $this->escapar($_POST);
        $flag = true;
        if (!empty($_POST["idReserva"]) && $this->validarReservaPost($_POST["idReserva"])) {
            if (isset($_POST["valorImpuesto"])) {
                $this->reservaM->quitarImpuestoAlTotalPagar($_POST["idReserva"]);
                $this->reservaM->actulizarImpuesto($_POST["valorImpuesto"], $_POST["idReserva"]);
                $this->reservaM->actualizarTotalPagar($_POST["valorImpuesto"], $_POST["idReserva"]);
            } else {
                $flag = false;
            }
        } else {
            $flag = false;
        }
        if ($flag) {
            $_SESSION["mensaje"]["contenido"] = "Los cambios se guardaron exitosamente";
            $_SESSION["mensaje"]["tipo"] = "exito";
            header("location:../facturacion?reserva=" . $_POST["idReserva"]);
        } else {
            $_SESSION["mensaje"]["contenido"] = "Error en la operación";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
        }
    }

    public function crearAjuste() {
        $this->escapar($_POST);
        if (!empty($_POST["idReserva"]) && $this->validarReservaPost($_POST["idReserva"])) {
            $this->ajusteM->crearAjuste($_POST["valorDescuento"], $_POST["descripcionDescuento"], $_POST["idReserva"], $_SESSION["usuario"]["id_usuario"]);
            $this->reservaM->actualizarTotalPagar($_POST["valorDescuento"], $_POST["idReserva"]);
            $this->reservaM->actualizarEstatus($_POST["idReserva"]);

            $_SESSION["mensaje"]["contenido"] = "El ajuste se creó exitosamente";
            $_SESSION["mensaje"]["tipo"] = "exito";
            header("location:../facturacion?reserva=" . $_POST["idReserva"]);
        } else {
            $_SESSION["mensaje"]["contenido"] = "Error en la operación";
            $_SESSION["mensaje"]["tipo"] = "advertencia";
            header("Location:../calendario");
        }
    }

    public function registrarPago() {
        $this->escapar($_POST);
        if (!empty($_POST["idReserva"]) && $this->validarReservaPost($_POST["idReserva"])) {
            if ($_POST["valorPago"] != 0) {
                $this->ingreso_reservaM->registrarPago($_POST["valorPago"], $_POST["descripcionPago"], $_POST["modoPago"], $_POST["idReserva"], $_SESSION["usuario"]["id_usuario"]);
                $this->reservaM->actualizarIngreso($_POST["valorPago"], $_POST["idReserva"]);
                $this->reservaM->actualizarEstatus($_POST["idReserva"]);
                $_SESSION["mensaje"]["contenido"] = "El pago se registro correctamente";
                $_SESSION["mensaje"]["tipo"] = "exito";
                header("location:../facturacion?reserva=" . $_POST["idReserva"]);
            } else {
                $_SESSION["mensaje"]["contenido"] = "No se pude registrar un pago de " . $_SESSION["establecimiento"]["moneda"] . "0";
                $_SESSION["mensaje"]["tipo"] = "advertencia";
                header("location:../facturacion?reserva=" . $_POST["idReserva"]);
            }
        }
    }

    private function validarReserva() {
        if (!empty($_GET["reserva"])) {
            $r = $this->reservaM->esMiReserva($_GET["reserva"], $_SESSION['establecimiento']['id_establecimiento']);
            if ($r[0]->cantidad == 1) {
                return true;
            } else {
                return false;
            }
        }
    }

    private function validarReservaPost($idReserva) {
        $r = $this->reservaM->esMiReserva($idReserva, $_SESSION['establecimiento']['id_establecimiento']);
        if ($r[0]->cantidad == 1) {
            return true;
        } else {
            return false;
        }
    }

    private function formatoFechaBD(&$fecha) {
        $fecha = explode("/", $fecha);
        $fecha = "$fecha[2]-$fecha[1]-$fecha[0]";
    }

    private function formatoFechaVista(&$fecha) {
        $fecha = explode("-", $fecha);
        $fecha = "$fecha[2]/$fecha[1]/$fecha[0]";
    }

    private function diferenciaFechas($desde, $hasta) {
        $datetime1 = date_create($desde);
        $datetime2 = date_create($hasta);
        $intervalo = date_diff($datetime1, $datetime2);
        return $intervalo->days;
    }

}